/**
 * 基础页面组件，封装通用的生命周期函数和埋点功能
 * 
 * 使用方法：
 * const BasePage = require('../../pages/base')
 * 
 * Page(BasePage({
 *   data: { ... },
 *   onLoad(options) {
 *     // 调用基类方法
 *     this.baseOnLoad(options)
 *     // 自己的逻辑
 *     ...
 *   }
 * }))
 */

// 获取全局应用实例
const app = getApp()

/**
 * 基础页面构造器
 * @param {Object} pageObj 页面对象
 * @returns {Object} 增强后的页面对象
 */
function BasePage(pageObj) {
  // 保存原始的生命周期方法
  const originalOnLoad = pageObj.onLoad
  const originalOnShow = pageObj.onShow
  const originalOnHide = pageObj.onHide
  const originalOnUnload = pageObj.onUnload
  
  // 封装处理路由参数的方法
  if (!pageObj.processOptions) {
    pageObj.processOptions = function(options) {
      // 默认的参数处理逻辑，子类可覆盖
      return options || {}
    }
  }
  
  // 拓展onLoad方法
  pageObj.onLoad = function(options) {
    // 存储页面路径和参数
    this.pagePath = getCurrentPages().pop().route
    this.pageOptions = this.processOptions(options)
    
    // 页面加载埋点
    if (app.analytics) {
      try {
        app.analytics.pageView(this.pagePath, this.pageOptions)
      } catch (error) {
        console.error('埋点错误:', error)
      }
    }
    
    // 调用原始onLoad
    if (originalOnLoad) {
      originalOnLoad.call(this, options)
    }
  }
  
  // 拓展onShow方法
  pageObj.onShow = function() {
    // 页面显示时记录访问时间
    this.pageShowTime = Date.now()
    
    // 调用原始onShow
    if (originalOnShow) {
      originalOnShow.call(this)
    }
  }
  
  // 拓展onHide方法
  pageObj.onHide = function() {
    // 页面隐藏时计算停留时间并埋点
    if (this.pageShowTime && app.analytics) {
      const stayDuration = Math.floor((Date.now() - this.pageShowTime) / 1000)
      
      try {
        app.analytics.track('page_duration', null, {
          page_path: this.pagePath,
          stay_duration: stayDuration,
          page_options: this.pageOptions
        })
      } catch (error) {
        console.error('埋点错误:', error)
      }
    }
    
    // 调用原始onHide
    if (originalOnHide) {
      originalOnHide.call(this)
    }
  }
  
  // 拓展onUnload方法
  pageObj.onUnload = function() {
    // 页面卸载时，如果还没记录停留时间则记录
    if (this.pageShowTime && app.analytics) {
      const stayDuration = Math.floor((Date.now() - this.pageShowTime) / 1000)
      
      try {
        app.analytics.track('page_duration', null, {
          page_path: this.pagePath,
          stay_duration: stayDuration,
          page_options: this.pageOptions
        })
      } catch (error) {
        console.error('埋点错误:', error)
      }
    }
    
    // 调用原始onUnload
    if (originalOnUnload) {
      originalOnUnload.call(this)
    }
  }
  
  // 添加统一的埋点方法
  if (!pageObj.trackEvent) {
    /**
     * 页面埋点方法
     * @param {String} eventName 事件名称
     * @param {Object} data 事件数据
     */
    pageObj.trackEvent = function(eventName, data = {}) {
      if (app.analytics) {
        try {
          // 添加页面信息
          const eventData = {
            ...data,
            page_path: this.pagePath
          }
          
          app.analytics.track('click', null, {
            event_name: eventName,
            ...eventData
          })
        } catch (error) {
          console.error('埋点错误:', error)
        }
      }
    }
  }
  
  // 添加基础方法的调用
  pageObj.baseOnLoad = function(options) {
    // 基类onLoad逻辑，可被子类调用
    console.log(`[BasePage] ${this.pagePath} onLoad`)
  }
  
  return pageObj
}

module.exports = BasePage 